home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / dolmorph / src / tech.txt < prev    next >
Encoding:
Text File  |  1994-10-08  |  3.8 KB  |  148 lines

  1.  
  2.  
  3.  
  4.  
  5.                        GUIライブラリ・小テクニック(1)
  6.                         (ウィンドウの子部品を再配置
  7.                          するときの記述テクニック)
  8.  
  9.                                  松内 良介
  10.  
  11.                                 Oct. 9 1994
  12.  
  13.  
  14.  
  15. 1.  ウィンドウのリサイズの記述は面倒 (~^T)
  16.  
  17.   GUIライブラリを利用していて、 ウィンドウがリサイズされたときのスクロー
  18. ルバーの位置・大きさ調整の記述を面倒に思ったことはありませんか? その面倒さ
  19. は、一般的に言えば、 「ウィンドウ上に置かれた部品を再配置する処理の記述の面
  20. 倒さ」です。 この面倒さに対して、私が個人的に実践している対処方法を紹介しま
  21. す(単なるコーディングテクニックに過ぎないのですが……)。
  22.  
  23.  
  24. 2.  ウィンドウ上の部品の位置・大きさの決め方
  25.  
  26.   スクロールバーの場合なら、スクロールバーの表示枠(HYPER型の  fr  メンバ)
  27. は、次のように決まるのが普通です。
  28.  
  29.  
  30.   「ウィンドウの右端(または下端)
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  void RM_adjustFrame(int kobj, int baseobj, FRAME *parm)
  38.  {
  39.   HYPER hyp, hypBase;
  40.   MMI_SendMessage(kobj, MM_GETHYPER, 1, &hyp);
  41.   MMI_SendMessage(baseobj, MM_GETHYPER, 1, &hypBase);
  42.   #define DO(t1, t2, t3)        \
  43.    if (parm->t1 >= 0)        \
  44.     hyp.fr.t1 = hypBase.fr.t2 + parm->t1;  \
  45.    else           \
  46.     hyp.fr.t1 = hypBase.fr.t3 + 1 + parm->t1;
  47.   DO(lupx, lupx, rdwx)
  48.   DO(lupy, lupy, rdwy)
  49.   DO(rdwx, lupx, rdwx)
  50.   DO(rdwy, lupy, rdwy)
  51.   #undef DO
  52.   MMI_SendMessage(kobj, MM_SETHYPER, 1, &hyp);
  53.  }
  54.  
  55.  void RM_adjustWinUser(int idWin, FRAME *parm)
  56.  {
  57.   HYPER hyp;
  58.   FRAME frUser, frResize;
  59.   MMI_SendMessage(idWin, MM_GETHYPER, 1, &hyp);
  60.   MMI_SendMessage(idWin, MM_GETUSER, 2, &frUser, &frResize);
  61.   #define DO(t1, t2, t3)       \
  62.    if (parm->t1 >= 0)       \
  63.     frUser.t1 = hyp.fr.t2 + parm->t1;  \
  64.    else          \
  65.     frUser.t1 = hyp.fr.t3 + 1 + parm->t1;
  66.   DO(lupx, lupx, rdwx)
  67.   DO(lupy, lupy, rdwy)
  68.   DO(rdwx, lupx, rdwx)
  69.   DO(rdwy, lupy, rdwy)
  70.   #undef DO
  71.   frUser.rdwx = frUser.rdwx - frUser.lupx + 1;
  72.   frUser.rdwy = frUser.rdwy - frUser.lupy + 1;
  73.   frUser.lupx = frUser.lupx - hyp.fr.lupx;
  74.   frUser.lupy = frUser.lupy - hyp.fr.lupy;
  75.   MMI_SendMessage(idWin, MM_SETUSER, 1, &frUser, &frResize);
  76.  }
  77.  
  78.  
  79.  
  80.  
  81.  static void AdjustImageStoreWin(int side)
  82.  {
  83.   RM_adjustFrame(idImageStoreTitleDBtn[side], idImageStoreWin[side],
  84.         &frAdjTitleDBtn);
  85.   RM_adjustFrame(idImageStoreSBarV[side], idImageStoreWin[side],
  86.         &frAdjSBarV);
  87.   RM_adjustFrame(idImageStoreEditMenuDBtn[side], idImageStoreWin[side],
  88.         &frAdjEditMenuDBtn);
  89.   int i;
  90.   for (i=0; i<3; i++)
  91.   {
  92.    RM_adjustFrame(idImageStoreEditDBtn[side][i],idImageStoreWin[side],
  93.          &frAdjEditDBtn[i]);
  94.    RM_adjustFrame(idImageStoreEditMsg[side][i],idImageStoreWin[side],
  95.          &frAdjEditDBtn[i]);
  96.   }
  97.   RM_adjustWinUser(idImageStoreWin[side], &frAdjWinUser);
  98.  }
  99.  
  100.  int init_imstore(void)
  101.  {
  102.   int i;
  103.   for (i=0; i<2; i++)
  104.   {
  105.    AdjustImageStoreWin(i);
  106.    swin[i].plImage = list_new(sizeof(SIMAGE*));
  107.    swin[i].idWin   = idImageStoreWin[i];
  108.    swin[i].idSBarV = idImageStoreSBarV[i];
  109.    setSBarImageList(&swin[i], FALSE);
  110.   }
  111.   return 0;
  112.  }
  113.  
  114.  /* initDataZIMSTORE:idImageStoreWin[1]:MJ_WINDOWL40の呼び出し関数 */
  115.  int ImageStoreWinFunc(kobj, messId, argc, pev, trigger)
  116.  int  kobj ;
  117.  int  messId ;
  118.  int  argc ;
  119.  EVENT *pev ;
  120.  int  trigger ;
  121.  {
  122.   int side;
  123.   if (kobj == idImageStoreWin[0])
  124.    side = 0;
  125.   else
  126.    side = 1;
  127.   if (messId == MM_SHOW)
  128.    dispImageList(&swin[side]);
  129.   else if (messId == MM_UPDATE)
  130.   {
  131.    AdjustImageStoreWin(side);
  132.    setSBarImageList(&swin[side], TRUE);
  133.   }
  134.   else if (messId == MM_MOVE)
  135.   {
  136.    RM_roundFramePosition(swin[side].idWin, 2,2);
  137.    dispImageList(&swin[side]);
  138.   }
  139.   else if (messId == MM_MOUSEON)
  140.   {
  141.    imstore_WinUserMouseOn(side, swin[side].plImage, pev);
  142.    dispImageList(&swin[side]);
  143.    // printf("ImageStoreWinFunc: %d %d\n",t,n);
  144.   }
  145.   return NOERR ;
  146.  }
  147.  
  148.